package com.xiangban.xiangbanmall.service;

import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayUtil;
import com.xiangban.xiangbanmall.utils.WXConfigUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.Map;

/**
 * @Author Mr. MaYaYun
 * @Data 2021/11/13 11:01
 */
@Service
public class PayService {

    @Value("${wx.WX_APPLETS_ID}")
    private String APP_ID;
    @Value("${wx.WX_APPLETS_KEY}")
    private String APP_KEY;
    @Value("${wx.WX_MCH_ID}")
    private String MCH_ID;


    public String payBack(String resXml) {//回调通知
        System.out.println("resXml******:" + resXml);

        WXConfigUtil config = null;
        try {
            config = new WXConfigUtil();
            config.setAPP_ID(APP_ID);//appid
            config.setAPP_KEY(APP_KEY);//小程序/app密钥
            config.setMCH_ID(MCH_ID);//商户号
        } catch (Exception e) {
            e.printStackTrace();
        }
        WXPay wxpay = new WXPay(config);
        String xmlBack = "";
        Map<String, String> notifyMap = null;
        try {
            notifyMap = WXPayUtil.xmlToMap(resXml);         // 调用官方SDK转换成map类型数据
//            if (wxpay.isResponseSignatureValid(notifyMap)) {//验证签名是否有效，有效则进一步处理
            if (true) {//验证签名是否有效，有效则进一步处理
                String return_code = notifyMap.get("return_code");//状态
                System.out.println("return_code******" + return_code);
                String out_trade_no = notifyMap.get("out_trade_no");//商户订单号
                if (return_code.equals("SUCCESS")) {
                    if (out_trade_no != null) {
                        // 注意特殊情况：订单已经退款，但收到了支付结果成功的通知，不应把商户的订单状态从退款改成支付成功
                        // 注意特殊情况：微信服务端同样的通知可能会多次发送给商户系统，所以数据持久化之前需要检查是否已经处理过了，处理了直接返回成功标志

                        xmlBack = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>" + "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";
                    } else {
                        //log.info("微信手机支付回调失败订单号:{}", out_trade_no);
                        xmlBack = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>" + "<return_msg><![CDATA[报文为空]]></return_msg>" + "</xml> ";
                    }
                }
                return xmlBack;
            } else {
                // 签名错误，如果数据里没有sign字段，也认为是签名错误
                //失败的数据要不要存储？
                //log.error("手机支付回调通知签名错误");
                xmlBack = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>" + "<return_msg><![CDATA[报文为空]]></return_msg>" + "</xml> ";
                return xmlBack;
            }
        } catch (Exception e) {
            //log.error("手机支付回调通知失败", e);
            xmlBack = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>" + "<return_msg><![CDATA[报文为空]]></return_msg>" + "</xml> ";
        }
        return xmlBack;
    }
}

